+Sat Oct 30 13:17:18 BST 1999 Tony Gale <gale@gtk.org>
+
+ * docs/gtkfaq.sgml: FAQ update
+
1999-10-21 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkprivate.h: Add more font private data.
+Sat Oct 30 13:17:18 BST 1999 Tony Gale <gale@gtk.org>
+
+ * docs/gtkfaq.sgml: FAQ update
+
1999-10-21 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkprivate.h: Add more font private data.
+Sat Oct 30 13:17:18 BST 1999 Tony Gale <gale@gtk.org>
+
+ * docs/gtkfaq.sgml: FAQ update
+
1999-10-21 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkprivate.h: Add more font private data.
+Sat Oct 30 13:17:18 BST 1999 Tony Gale <gale@gtk.org>
+
+ * docs/gtkfaq.sgml: FAQ update
+
1999-10-21 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkprivate.h: Add more font private data.
+Sat Oct 30 13:17:18 BST 1999 Tony Gale <gale@gtk.org>
+
+ * docs/gtkfaq.sgml: FAQ update
+
1999-10-21 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkprivate.h: Add more font private data.
+Sat Oct 30 13:17:18 BST 1999 Tony Gale <gale@gtk.org>
+
+ * docs/gtkfaq.sgml: FAQ update
+
1999-10-21 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkprivate.h: Add more font private data.
+Sat Oct 30 13:17:18 BST 1999 Tony Gale <gale@gtk.org>
+
+ * docs/gtkfaq.sgml: FAQ update
+
1999-10-21 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkprivate.h: Add more font private data.
<title>GTK+ FAQ
<!-- NOTE: Use only one author tag, otherwise sgml2txt barfs - TRG -->
-<author>Nathan Froyd, Tony Gale, Shawn T. Amundson, Emmanuel Deloget
+<author>Tony Gale, Shawn T. Amundson, Emmanuel Deloget, Nathan Froyd
-<date>August 29th 1999
+<date>October 30th 1999
<abstract> This document is intended to answer questions that are likely to be
frequently asked by programmers using GTK+ or people who are just looking at
GDK == Gtk+ Drawing Kit
-GLib == G Library
+GLib == G Libray
<!-- ----------------------------------------------------------------- -->
<sect1>Where is the documentation for GTK+?
<htmlurl url="ftp://ftp.gtk.org/pub/gtk/tutorial"
name="ftp://ftp.gtk.org/pub/gtk/tutorial">
-There is also a book available that details programming with GTK+ and
-GDK which has been written by Eric Harlow. It is entitled "Developing
-Linux Applications with GTK+ and GDK" and is available at all good
-book stores. The ISBN is 0-7357-0021-4
-
+There are now a couple of books available that deal with programming
+GTK+, GDK and GNOME:
+<itemize>
+<item> Eric Harlows book entitled "Developing Linux Applications with
+GTK+ and GDK". The ISBN is 0-7357-0021-4
+<P>
The example code from Eric's book is available on-line at
<htmlurl url="http://www.bcpl.net/~eharlow/book"
name="http://www.bcpl.net/~eharlow/book">
+<item> Havoc Pennington has released a book called "GTK+/GNOME
+Application Development". The ISBN is 0-7357-0078-8
+<P>
+The free version of the book lives here:
+<htmlurl url="http://developer.gnome.org/doc/GGAD/"
+name="http://developer.gnome.org/doc/GGAD/">
+<P>
+And Havoc maintains information about it and errata here:
+<htmlurl url="http://pobox.com/~hp/gnome-app-devel.html"
+name="http://pobox.com/~hp/gnome-app-devel.html">
+</itemize>
+
<!-- ----------------------------------------------------------------- -->
<sect1>Is there a mailing list (or mailing list archive) for GTK+?
<p>
<!-- ----------------------------------------------------------------- -->
<sect1>How to get help with GTK+
<p>
-First, make sure your question isn't answered in the documentation, this
-FAQ or the tutorial. Done that? You're sure you've done that, right? In
-that case, the best place to post questions is to the GTK+ mailing list.
+First, make sure your question isn't answered in the documentation,
+this FAQ or the tutorial. Done that? You're sure you've done that,
+right? In that case, the best place to post questions is to the GTK+
+mailing list.
<!-- ----------------------------------------------------------------- -->
<sect1>How to report bugs in GTK+
<item> How to reproduce the bug.
- If you can reproduce it with the testgtk program that is built
- in the gtk/ subdirectory, that will be most convenient. Otherwise,
- please include a short test program that exhibits the behavior.
- As a last resort, you can also provide a pointer to a larger piece
- of software that can be downloaded.
+ If you can reproduce it with the testgtk program that is built in
+ the gtk/ subdirectory, that will be most convenient. Otherwise,
+ please include a short test program that exhibits the behavior. As
+ a last resort, you can also provide a pointer to a larger piece of
+ software that can be downloaded.
- (Bugs that can be reproduced within the GIMP are almost as good
- as bugs that can be reproduced in testgtk. If you are reporting a
- bug found with the GIMP, please include the version number of the GIMP
+ (Bugs that can be reproduced within the GIMP are almost as good as
+ bugs that can be reproduced in testgtk. If you are reporting a bug
+ found with the GIMP, please include the version number of the GIMP
you are using)
<item> If the bug was a crash, the exact text that was printed out
when the crash occured.
-<item> Further information such as stack traces may be useful, but
- are not necessary. If you do send a stack trace, and the error
- is an X error, it will be more useful if the stacktrace
- is produced running the test program with the <tt/--sync/ command
- line option.
+<item> Further information such as stack traces may be useful, but are
+ not necessary. If you do send a stack trace, and the error is an X
+ error, it will be more useful if the stacktrace is produced running
+ the test program with the <tt/--sync/ command line option.
</itemize>
<!-- ----------------------------------------------------------------- -->
a GTK+ based RAD tool which produces GTK+ applications
</itemize>
<p>
-In addition to the above, the GNOME project (<htmlurl url="http://www.gnome.org"
-name="http://www.gnome.org">)
-is using GTK+ to build a free desktop for Linux. Many more programs can be found
+In addition to the above, the GNOME project (<htmlurl
+url="http://www.gnome.org" name="http://www.gnome.org">) is using GTK+
+to build a free desktop for Linux. Many more programs can be found
there.
<!-- ----------------------------------------------------------------- -->
<sect1>I'm looking for an application to write in GTK+. How about an IRC client?
<p>
-Ask on gtk-list for suggestions. There are at least three IRC
-clients already under development (probably more in fact. The server at
+Ask on gtk-list for suggestions. There are at least three IRC clients
+already under development (probably more in fact. The server at
<htmlurl url="http://www.forcix.cx/irc-clients.html"
name="http://www.forcix.cx/irc-clients.html"> list a bunch of them).
<itemize>
+<item>X-Chat.
<item>girc. (Included with GNOME)
-<item>Bezerk (<htmlurl url="http://www.gtk.org/~trog/"
- name="http://www.gtk.org/~trog/">)
<item>gsirc. (In the gnome CVS tree)
</itemize>
The Tutorial doesn't (yet) contain information on all of the widgets
that are in GTK+. For example code on how to use the basics of all the
GTK+ widgets you should look at the file gtk/testgtk.c (and associated
-source files) within the GTK+ distribution. Looking at these exmaples will
+source files) within the GTK+ distribution. Looking at these examples will
give you a good grounding on what the widgets can do.
<!-- ----------------------------------------------------------------- -->
<sect1>Why do this strange 'x io error' occur when I <tt/fork()/ in my GTK+ app?
<p>
This is not really a GTK+ problem, and the problem is not related to <tt/fork()/
-too. If the 'x io error' occurs then you probably use the <tt/exit()/ function
+either. If the 'x io error' occurs then you probably use the <tt/exit()/ function
in order to exit from the child process.
When GDK opens an X display, it creates a socket file descriptor. When you use
The right function to use here is <tt/_exit()/.
-Erik Mouw gave the following piece of code about the fork()/exit() problem
-(slightly modified)
+Erik Mouw gave the following code example to illustrate handling
+fork() and exit().
<tscreen><verb>
- int pid = fork();
+/*-------------------------------------------------------------------------
+ * Filename: gtk-fork.c
+ * Version: 0.99.1
+ * Copyright: Copyright (C) 1999, Erik Mouw
+ * Author: Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
+ * Description: GTK+ fork example
+ * Created at: Thu Sep 23 21:37:55 1999
+ * Modified by: Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
+ * Modified at: Thu Sep 23 22:39:39 1999
+ *-----------------------------------------------------------------------*/
+/*
+ * Compile with:
+ *
+ * cc -o gtk-fork gtk-fork.c `gtk-config --cflags --libs`
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <gtk/gtk.h>
+
+void sigchld_handler(int num)
+{
+ sigset_t set, oldset;
+ pid_t pid;
+ int status, exitstatus;
+
+ /* block other incoming SIGCHLD signals */
+ sigemptyset(&set);
+ sigaddset(&set, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &set, &oldset);
+
+ /* wait for child */
+ while((pid = waitpid((pid_t)-1, &status, WNOHANG)) > 0)
+ {
+ if(WIFEXITED(status))
+ {
+ exitstatus = WEXITSTATUS(status);
+
+ fprintf(stderr,
+ "Parent: child exited, pid = %d, exit status = %d\n",
+ (int)pid, exitstatus);
+ }
+ else if(WIFSIGNALED(status))
+ {
+ exitstatus = WTERMSIG(status);
+
+ fprintf(stderr,
+ "Parent: child terminated by signal %d, pid = %d\n",
+ exitstatus, (int)pid);
+ }
+ else if(WIFSTOPPED(status))
+ {
+ exitstatus = WSTOPSIG(status);
+
+ fprintf(stderr,
+ "Parent: child stopped by signal %d, pid = %d\n",
+ exitstatus, (int)pid);
+ }
+ else
+ {
+ fprintf(stderr,
+ "Parent: child exited magically, pid = %d\n",
+ (int)pid);
+ }
+ }
+
+ /* re-install the signal handler (some systems need this) */
+ signal(SIGCHLD, sigchld_handler);
+
+ /* and unblock it */
+ sigemptyset(&set);
+ sigaddset(&set, SIGCHLD);
+ sigprocmask(SIG_UNBLOCK, &set, &oldset);
+}
- if(pid==-1)
+gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ return(FALSE);
+}
+
+void destroy(GtkWidget *widget, gpointer data)
+{
+ gtk_main_quit();
+}
+
+void fork_me(GtkWidget *widget, gpointer data)
+{
+ pid_t pid;
+
+ pid = fork();
+
+ if(pid == -1)
{
+ /* ouch, fork() failed */
perror("fork");
exit(-1);
}
- else if(pid==0) /* child */
+ else if(pid == 0)
{
- retval=system("a command"); /* can use exec* functions here */
- _exit(retval); /* notice _exit() instead of exit() */
+ /* child */
+ fprintf(stderr, "Child: pid = %d\n", (int)getpid());
+
+ execlp("ls", "ls", "-CF", "/", NULL);
+
+ /* if exec() returns, there is something wrong */
+ perror("execlp");
+
+ /* exit child. note the use of _exit() instead of exit() */
+ _exit(-1);
}
- else /* parent */
+ else
{
- for(;;)
- {
- if(waitpid(pid, &status, WNOHANG) == pid)
- {
- waitpid(pid, &status, WUNTRACED); /* anti zombie code */
- break;
- }
- }
-
- return(WEXITSTATUS(status));
+ /* parent */
+ fprintf(stderr, "Parent: forked a child with pid = %d\n", (int)pid);
}
+}
+
+int main(int argc, char *argv[])
+{
+ GtkWidget *window;
+ GtkWidget *button;
+
+ gtk_init(&argc, &argv);
+
+ /* the basic stuff: make a window and set callbacks for destroy and
+ * delete events
+ */
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ gtk_signal_connect(GTK_OBJECT (window), "delete_event",
+ GTK_SIGNAL_FUNC(delete_event), NULL);
+
+ gtk_signal_connect(GTK_OBJECT (window), "destroy",
+ GTK_SIGNAL_FUNC(destroy), NULL);
+
+#if (GTK_MAJOR_VERSION == 1) && (GTK_MINOR_VERSION == 0)
+ gtk_container_border_width(GTK_CONTAINER (window), 10);
+#else
+ gtk_container_set_border_width(GTK_CONTAINER (window), 10);
+#endif
+
+ /* add a button to do something usefull */
+ button = gtk_button_new_with_label("Fork me!");
+
+ gtk_signal_connect(GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC(fork_me), NULL);
+
+ gtk_container_add(GTK_CONTAINER(window), button);
+
+ /* show everything */
+ gtk_widget_show (button);
+ gtk_widget_show (window);
+
+
+ /* install a signal handler for SIGCHLD signals */
+ signal(SIGCHLD, sigchld_handler);
+
+
+ /* main loop */
+ gtk_main ();
+
+ exit(0);
+}
</verb></tscreen>
<!-- ----------------------------------------------------------------- -->
</verb></tscreen>
<!-- ----------------------------------------------------------------- -->
+<sect1>How do I get the Window ID of a GtkWindow?
+<p>
+The actual Gdk/X window will be created when the widget gets
+realized. You can get the Window ID with:
+
+<verb>
+#include <gdk/gdkx.h>
+Window xwin = GDK_WINDOW_XWINDOW (GTK_WIDGET (my_window)->window);
+</verb>
+
+<!-- ----------------------------------------------------------------- -->
<sect1>How do I catch a double click event (in a list widget, for example)?
<p>
Tim Janik wrote to gtk-list (slightly modified):
force the drawing queue to be processed using something like:
<tscreen><verb>
-while (gtk_events_pending())
- gtk_main_iteration();
+while (gtk_main_iteration(FALSE));
</verb></tscreen>
inside you're function that changes the widget.
is a boolean value: when this value is TRUE, the widget is enabled.
<!-- ----------------------------------------------------------------- -->
-
<sect1>Shouldn't the text argument in the gtk_clist_* functions be declared const?
<p>
For example:
in the array case, it is not the array itself that needs the (const)
qualified cast, but its members, thus changing the whole type.
+<!-- ----------------------------------------------------------------- -->
+<sect1>How do I render pixels (image data) to the screen?
+<p>
+There are several ways to approach this. The simplest way is to use
+GdkRGB, see gdk/gdkrgb.h. You create an RGB buffer, render to your RGB
+buffer, then use GdkRGB routines to copy your RGB buffer to a drawing
+area or custom widget. The book "GTK+/Gnome Application Development"
+gives some details; GdkRGB is also documented in the GTK+ reference
+documentation.
+
+If you're writing a game or other graphics-intensive application, you
+might consider a more elaborate solution. OpenGL is the graphics
+standard that will let you access hardware accelaration in future
+versions of XFree86; so for maximum speed, you probably want to use
+OpenGL. A GtkGLArea widget is available for using OpenGL with GTK+
+(but GtkGLArea does not come with GTK+ itself). There are also several
+open source game libraries, such as ClanLib and Loki's Simple
+DirectMedia Layer library (SDL).
+
+You do NOT want to use <tt/gdk_draw_point()/, that will be extremely
+slow.
+
<!-- ***************************************************************** -->
<sect>Development with GTK+: widget specific questions
<!-- ***************************************************************** -->
}
widget "gtk-tooltips*" style "postie"
</verb>
+
+<!-- ----------------------------------------------------------------- -->
<sect1>How do I use horizontal scrollbars with a GtkText widget?
<p>
The short answer is that you can't. The current version of the GtkText
This document is maintained by Nathan Froyd
<htmlurl url="mailto:maestrox@geocities.com"
name="<maestrox@geocities.com>">,
-Tony Gale <htmlurl url="mailto:gale@gimp.org"
-name="<gale@gimp.org>"> and
+Tony Gale <htmlurl url="mailto:gale@gtk.org"
+name="<gale@gtk.org>"> and
Emmanuel Deloget <htmlurl url="mailto:logout@free.fr"
name="<logout@free.fr>">.
This FAQ was created by Shawn T. Amundson
<title>GTK+ FAQ
<!-- NOTE: Use only one author tag, otherwise sgml2txt barfs - TRG -->
-<author>Nathan Froyd, Tony Gale, Shawn T. Amundson, Emmanuel Deloget
+<author>Tony Gale, Shawn T. Amundson, Emmanuel Deloget, Nathan Froyd
-<date>August 29th 1999
+<date>October 30th 1999
<abstract> This document is intended to answer questions that are likely to be
frequently asked by programmers using GTK+ or people who are just looking at
GDK == Gtk+ Drawing Kit
-GLib == G Library
+GLib == G Libray
<!-- ----------------------------------------------------------------- -->
<sect1>Where is the documentation for GTK+?
<htmlurl url="ftp://ftp.gtk.org/pub/gtk/tutorial"
name="ftp://ftp.gtk.org/pub/gtk/tutorial">
-There is also a book available that details programming with GTK+ and
-GDK which has been written by Eric Harlow. It is entitled "Developing
-Linux Applications with GTK+ and GDK" and is available at all good
-book stores. The ISBN is 0-7357-0021-4
-
+There are now a couple of books available that deal with programming
+GTK+, GDK and GNOME:
+<itemize>
+<item> Eric Harlows book entitled "Developing Linux Applications with
+GTK+ and GDK". The ISBN is 0-7357-0021-4
+<P>
The example code from Eric's book is available on-line at
<htmlurl url="http://www.bcpl.net/~eharlow/book"
name="http://www.bcpl.net/~eharlow/book">
+<item> Havoc Pennington has released a book called "GTK+/GNOME
+Application Development". The ISBN is 0-7357-0078-8
+<P>
+The free version of the book lives here:
+<htmlurl url="http://developer.gnome.org/doc/GGAD/"
+name="http://developer.gnome.org/doc/GGAD/">
+<P>
+And Havoc maintains information about it and errata here:
+<htmlurl url="http://pobox.com/~hp/gnome-app-devel.html"
+name="http://pobox.com/~hp/gnome-app-devel.html">
+</itemize>
+
<!-- ----------------------------------------------------------------- -->
<sect1>Is there a mailing list (or mailing list archive) for GTK+?
<p>
<!-- ----------------------------------------------------------------- -->
<sect1>How to get help with GTK+
<p>
-First, make sure your question isn't answered in the documentation, this
-FAQ or the tutorial. Done that? You're sure you've done that, right? In
-that case, the best place to post questions is to the GTK+ mailing list.
+First, make sure your question isn't answered in the documentation,
+this FAQ or the tutorial. Done that? You're sure you've done that,
+right? In that case, the best place to post questions is to the GTK+
+mailing list.
<!-- ----------------------------------------------------------------- -->
<sect1>How to report bugs in GTK+
<item> How to reproduce the bug.
- If you can reproduce it with the testgtk program that is built
- in the gtk/ subdirectory, that will be most convenient. Otherwise,
- please include a short test program that exhibits the behavior.
- As a last resort, you can also provide a pointer to a larger piece
- of software that can be downloaded.
+ If you can reproduce it with the testgtk program that is built in
+ the gtk/ subdirectory, that will be most convenient. Otherwise,
+ please include a short test program that exhibits the behavior. As
+ a last resort, you can also provide a pointer to a larger piece of
+ software that can be downloaded.
- (Bugs that can be reproduced within the GIMP are almost as good
- as bugs that can be reproduced in testgtk. If you are reporting a
- bug found with the GIMP, please include the version number of the GIMP
+ (Bugs that can be reproduced within the GIMP are almost as good as
+ bugs that can be reproduced in testgtk. If you are reporting a bug
+ found with the GIMP, please include the version number of the GIMP
you are using)
<item> If the bug was a crash, the exact text that was printed out
when the crash occured.
-<item> Further information such as stack traces may be useful, but
- are not necessary. If you do send a stack trace, and the error
- is an X error, it will be more useful if the stacktrace
- is produced running the test program with the <tt/--sync/ command
- line option.
+<item> Further information such as stack traces may be useful, but are
+ not necessary. If you do send a stack trace, and the error is an X
+ error, it will be more useful if the stacktrace is produced running
+ the test program with the <tt/--sync/ command line option.
</itemize>
<!-- ----------------------------------------------------------------- -->
a GTK+ based RAD tool which produces GTK+ applications
</itemize>
<p>
-In addition to the above, the GNOME project (<htmlurl url="http://www.gnome.org"
-name="http://www.gnome.org">)
-is using GTK+ to build a free desktop for Linux. Many more programs can be found
+In addition to the above, the GNOME project (<htmlurl
+url="http://www.gnome.org" name="http://www.gnome.org">) is using GTK+
+to build a free desktop for Linux. Many more programs can be found
there.
<!-- ----------------------------------------------------------------- -->
<sect1>I'm looking for an application to write in GTK+. How about an IRC client?
<p>
-Ask on gtk-list for suggestions. There are at least three IRC
-clients already under development (probably more in fact. The server at
+Ask on gtk-list for suggestions. There are at least three IRC clients
+already under development (probably more in fact. The server at
<htmlurl url="http://www.forcix.cx/irc-clients.html"
name="http://www.forcix.cx/irc-clients.html"> list a bunch of them).
<itemize>
+<item>X-Chat.
<item>girc. (Included with GNOME)
-<item>Bezerk (<htmlurl url="http://www.gtk.org/~trog/"
- name="http://www.gtk.org/~trog/">)
<item>gsirc. (In the gnome CVS tree)
</itemize>
The Tutorial doesn't (yet) contain information on all of the widgets
that are in GTK+. For example code on how to use the basics of all the
GTK+ widgets you should look at the file gtk/testgtk.c (and associated
-source files) within the GTK+ distribution. Looking at these exmaples will
+source files) within the GTK+ distribution. Looking at these examples will
give you a good grounding on what the widgets can do.
<!-- ----------------------------------------------------------------- -->
<sect1>Why do this strange 'x io error' occur when I <tt/fork()/ in my GTK+ app?
<p>
This is not really a GTK+ problem, and the problem is not related to <tt/fork()/
-too. If the 'x io error' occurs then you probably use the <tt/exit()/ function
+either. If the 'x io error' occurs then you probably use the <tt/exit()/ function
in order to exit from the child process.
When GDK opens an X display, it creates a socket file descriptor. When you use
The right function to use here is <tt/_exit()/.
-Erik Mouw gave the following piece of code about the fork()/exit() problem
-(slightly modified)
+Erik Mouw gave the following code example to illustrate handling
+fork() and exit().
<tscreen><verb>
- int pid = fork();
+/*-------------------------------------------------------------------------
+ * Filename: gtk-fork.c
+ * Version: 0.99.1
+ * Copyright: Copyright (C) 1999, Erik Mouw
+ * Author: Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
+ * Description: GTK+ fork example
+ * Created at: Thu Sep 23 21:37:55 1999
+ * Modified by: Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
+ * Modified at: Thu Sep 23 22:39:39 1999
+ *-----------------------------------------------------------------------*/
+/*
+ * Compile with:
+ *
+ * cc -o gtk-fork gtk-fork.c `gtk-config --cflags --libs`
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <gtk/gtk.h>
+
+void sigchld_handler(int num)
+{
+ sigset_t set, oldset;
+ pid_t pid;
+ int status, exitstatus;
+
+ /* block other incoming SIGCHLD signals */
+ sigemptyset(&set);
+ sigaddset(&set, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &set, &oldset);
+
+ /* wait for child */
+ while((pid = waitpid((pid_t)-1, &status, WNOHANG)) > 0)
+ {
+ if(WIFEXITED(status))
+ {
+ exitstatus = WEXITSTATUS(status);
+
+ fprintf(stderr,
+ "Parent: child exited, pid = %d, exit status = %d\n",
+ (int)pid, exitstatus);
+ }
+ else if(WIFSIGNALED(status))
+ {
+ exitstatus = WTERMSIG(status);
+
+ fprintf(stderr,
+ "Parent: child terminated by signal %d, pid = %d\n",
+ exitstatus, (int)pid);
+ }
+ else if(WIFSTOPPED(status))
+ {
+ exitstatus = WSTOPSIG(status);
+
+ fprintf(stderr,
+ "Parent: child stopped by signal %d, pid = %d\n",
+ exitstatus, (int)pid);
+ }
+ else
+ {
+ fprintf(stderr,
+ "Parent: child exited magically, pid = %d\n",
+ (int)pid);
+ }
+ }
+
+ /* re-install the signal handler (some systems need this) */
+ signal(SIGCHLD, sigchld_handler);
+
+ /* and unblock it */
+ sigemptyset(&set);
+ sigaddset(&set, SIGCHLD);
+ sigprocmask(SIG_UNBLOCK, &set, &oldset);
+}
- if(pid==-1)
+gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ return(FALSE);
+}
+
+void destroy(GtkWidget *widget, gpointer data)
+{
+ gtk_main_quit();
+}
+
+void fork_me(GtkWidget *widget, gpointer data)
+{
+ pid_t pid;
+
+ pid = fork();
+
+ if(pid == -1)
{
+ /* ouch, fork() failed */
perror("fork");
exit(-1);
}
- else if(pid==0) /* child */
+ else if(pid == 0)
{
- retval=system("a command"); /* can use exec* functions here */
- _exit(retval); /* notice _exit() instead of exit() */
+ /* child */
+ fprintf(stderr, "Child: pid = %d\n", (int)getpid());
+
+ execlp("ls", "ls", "-CF", "/", NULL);
+
+ /* if exec() returns, there is something wrong */
+ perror("execlp");
+
+ /* exit child. note the use of _exit() instead of exit() */
+ _exit(-1);
}
- else /* parent */
+ else
{
- for(;;)
- {
- if(waitpid(pid, &status, WNOHANG) == pid)
- {
- waitpid(pid, &status, WUNTRACED); /* anti zombie code */
- break;
- }
- }
-
- return(WEXITSTATUS(status));
+ /* parent */
+ fprintf(stderr, "Parent: forked a child with pid = %d\n", (int)pid);
}
+}
+
+int main(int argc, char *argv[])
+{
+ GtkWidget *window;
+ GtkWidget *button;
+
+ gtk_init(&argc, &argv);
+
+ /* the basic stuff: make a window and set callbacks for destroy and
+ * delete events
+ */
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ gtk_signal_connect(GTK_OBJECT (window), "delete_event",
+ GTK_SIGNAL_FUNC(delete_event), NULL);
+
+ gtk_signal_connect(GTK_OBJECT (window), "destroy",
+ GTK_SIGNAL_FUNC(destroy), NULL);
+
+#if (GTK_MAJOR_VERSION == 1) && (GTK_MINOR_VERSION == 0)
+ gtk_container_border_width(GTK_CONTAINER (window), 10);
+#else
+ gtk_container_set_border_width(GTK_CONTAINER (window), 10);
+#endif
+
+ /* add a button to do something usefull */
+ button = gtk_button_new_with_label("Fork me!");
+
+ gtk_signal_connect(GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC(fork_me), NULL);
+
+ gtk_container_add(GTK_CONTAINER(window), button);
+
+ /* show everything */
+ gtk_widget_show (button);
+ gtk_widget_show (window);
+
+
+ /* install a signal handler for SIGCHLD signals */
+ signal(SIGCHLD, sigchld_handler);
+
+
+ /* main loop */
+ gtk_main ();
+
+ exit(0);
+}
</verb></tscreen>
<!-- ----------------------------------------------------------------- -->
</verb></tscreen>
<!-- ----------------------------------------------------------------- -->
+<sect1>How do I get the Window ID of a GtkWindow?
+<p>
+The actual Gdk/X window will be created when the widget gets
+realized. You can get the Window ID with:
+
+<verb>
+#include <gdk/gdkx.h>
+Window xwin = GDK_WINDOW_XWINDOW (GTK_WIDGET (my_window)->window);
+</verb>
+
+<!-- ----------------------------------------------------------------- -->
<sect1>How do I catch a double click event (in a list widget, for example)?
<p>
Tim Janik wrote to gtk-list (slightly modified):
force the drawing queue to be processed using something like:
<tscreen><verb>
-while (gtk_events_pending())
- gtk_main_iteration();
+while (gtk_main_iteration(FALSE));
</verb></tscreen>
inside you're function that changes the widget.
is a boolean value: when this value is TRUE, the widget is enabled.
<!-- ----------------------------------------------------------------- -->
-
<sect1>Shouldn't the text argument in the gtk_clist_* functions be declared const?
<p>
For example:
in the array case, it is not the array itself that needs the (const)
qualified cast, but its members, thus changing the whole type.
+<!-- ----------------------------------------------------------------- -->
+<sect1>How do I render pixels (image data) to the screen?
+<p>
+There are several ways to approach this. The simplest way is to use
+GdkRGB, see gdk/gdkrgb.h. You create an RGB buffer, render to your RGB
+buffer, then use GdkRGB routines to copy your RGB buffer to a drawing
+area or custom widget. The book "GTK+/Gnome Application Development"
+gives some details; GdkRGB is also documented in the GTK+ reference
+documentation.
+
+If you're writing a game or other graphics-intensive application, you
+might consider a more elaborate solution. OpenGL is the graphics
+standard that will let you access hardware accelaration in future
+versions of XFree86; so for maximum speed, you probably want to use
+OpenGL. A GtkGLArea widget is available for using OpenGL with GTK+
+(but GtkGLArea does not come with GTK+ itself). There are also several
+open source game libraries, such as ClanLib and Loki's Simple
+DirectMedia Layer library (SDL).
+
+You do NOT want to use <tt/gdk_draw_point()/, that will be extremely
+slow.
+
<!-- ***************************************************************** -->
<sect>Development with GTK+: widget specific questions
<!-- ***************************************************************** -->
}
widget "gtk-tooltips*" style "postie"
</verb>
+
+<!-- ----------------------------------------------------------------- -->
<sect1>How do I use horizontal scrollbars with a GtkText widget?
<p>
The short answer is that you can't. The current version of the GtkText
This document is maintained by Nathan Froyd
<htmlurl url="mailto:maestrox@geocities.com"
name="<maestrox@geocities.com>">,
-Tony Gale <htmlurl url="mailto:gale@gimp.org"
-name="<gale@gimp.org>"> and
+Tony Gale <htmlurl url="mailto:gale@gtk.org"
+name="<gale@gtk.org>"> and
Emmanuel Deloget <htmlurl url="mailto:logout@free.fr"
name="<logout@free.fr>">.
This FAQ was created by Shawn T. Amundson